
package cn.org.rapid_framework.generator.ext;

import java.io.File;
import java.util.Scanner;
import cn.org.rapid_framework.generator.GeneratorFacade;
import cn.org.rapid_framework.generator.GeneratorProperties;
import cn.org.rapid_framework.generator.util.ArrayHelper;
import cn.org.rapid_framework.generator.util.StringHelper;
import cn.org.rapid_framework.generator.util.SystemHelper;

/**
 * 命令行工具类,可以直接运行
 * 
 * @author badqiu
 */
public class CommandLine {

    public static void main(String[] args) throws Exception {

	// disable freemarker logging
	freemarker.log.Logger.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_NONE);

	startProcess();
    }

    private static void startProcess() throws Exception {

	Scanner sc = new Scanner(System.in);
	System.out.println("templateRootDir:"+new File(getTemplateRootDir()).getAbsolutePath());
	printUsages();
	while (sc.hasNextLine()) {
	    try {
		processLine(sc);
	    } catch (Exception e) {
		e.printStackTrace();
	    } finally {
		Thread.sleep(700);
		printUsages();
	    }
	}
    }

    private static void processLine(Scanner sc) throws Exception {

	GeneratorFacade facade = new GeneratorFacade();
	String cmd = sc.next();
	if ("gen".equals(cmd)) {
	    String[] args = nextArguments(sc);
	    if (args.length==0)
		return;
	    facade.g.setIncludes(getIncludes(args, 1));
	    facade.generateByTable(args[0], getTemplateRootDir());
	    if (SystemHelper.isWindowsOS) {
		Runtime.getRuntime().exec(
			"cmd.exe /c start "
				+GeneratorProperties.getRequiredProperty("outRoot").replace('/',
					'\\'));
	    }
	} else if ("del".equals(cmd)) {
	    String[] args = nextArguments(sc);
	    if (args.length==0)
		return;
	    facade.g.setIncludes(getIncludes(args, 1));
	    facade.deleteByTable(args[0], getTemplateRootDir());
	} else if ("quit".equals(cmd)) {
	    System.exit(0);
	} else {
	    System.err.println(" [ERROR] unknow command:"+cmd);
	}
    }

    private static String getIncludes(String[] args, int i) {

	String includes = ArrayHelper.getValue(args, i);
	if (includes==null)
	    return null;
	return includes.indexOf("*")>=0||includes.indexOf(",")>=0 ? includes : includes+"/**";
    }

    private static String getTemplateRootDir() {

	return System.getProperty("templateRootDir", "template");
    }

    private static void printUsages() {

	System.out.println("Usage:");
	System.out.println("\tgen table_name [include_path]: generate files by table_name");
	System.out.println("\tdel table_name [include_path]: delete files by table_name");
	System.out.println("\tgen * [include_path]: search database all tables and generate files");
	System.out.println("\tdel * [include_path]: search database all tables and delete files");
	System.out.println("\tquit : quit");
	System.out
		.println("\t[include_path] subdir of templateRootDir,example: 1. dao  2. dao/**,service/**");
	System.out.print("please input command:");
    }

    private static String[] nextArguments(Scanner sc) {

	return StringHelper.tokenizeToStringArray(sc.nextLine(), " ");
    }
}
